home *** CD-ROM | disk | FTP | other *** search
- {
- Q: How do I close a file that was opened in a DLL (Delphi
- made) and called from VB?
-
- A: This is a known problem. It comes from the fact that VB
- closes the 5 DOS standard handles (0..4) at startup. So the
- open file routine will reuse one of these handles to open the
- first disk file. That is not a problem in using the file, but
- the Pascal Close routine has a build-in safety feature: it
- refuses to close a file that has one of the standard handles!
- That is a Good Thing under DOS but screws up the works in your
- situation since the file opened by the DLL is never closed, not
- even when the DLL goes down! VC++ is obviously less restricted
- and will close a standard handle.
-
- You can fix this problem yourself. Instead of using the Pascal
- Close/CloseFile routine to close the file in the DLL, use one
- of these:
- }
-
- Procedure ReallyCloseFileVar(Var F); Assembler;
- { F should be a file type }
- Asm
- les bx, F { store F in es:bx }
- mov bx, word ptr es:[bx] { store handle in bx }
- mov ah, $3E { function 3Eh = close file }
- call Dos3Call { execute int 21h }
- End;
-
- Procedure ReallyCloseFileHandle(FileHandle: word); assembler;
- { FileHandle is the DOS file handle }
- asm
- mov bx, Handle { store handle in bx }
- mov ah, $3E { function 3Eh = close file }
- call DOS3Call { execute int 21h }
- end;